import math

def sieve(n):
    in_prime = []
    start = 2
    end   = int(math.sqrt(n)) # Size of every segment
    temp = [True] * (end + 1)
    prime = []
    
    while(start <= end):
        if temp[start] == True:
            in_prime.append(start)
            for i in range(start*start, end+1, start):
                if temp[i] == True:
                    temp[i] = False
        start += 1
    prime += in_prime
    
    low = end + 1
    high = low + end - 1
    if high > n:
        high = n
    
    while(low <= n):
        temp = [True] * (high-low+1)
        for each in in_prime:
            
            t = math.floor(low / each) * each
            if t < low:
                t += each
            
            for j in range(t, high+1, each):
                temp[j - low] = False
                
        for j in range(len(temp)):
            if temp[j] == True:
                prime.append(j+low)
        
        low = high + 1
        high = low + end - 1
        if high > n:
            high = n
            
    return prime

print(sieve(10**6))